/**
 * 正则校验前端伪代码
 */

// 此方法模拟前端的错误提示信息，展示逻辑根据具体框架确定
function showErrorMsg(fieldVal,msg){
    // ElMessage.warn(msg)
}

// 是否校验成功（blur后或提交前触发）
// 以后可能需要支持表达上下文之间的判定，如开始日期必须早于结束日期，但目前没提，先不考虑
function isValid(fieldVal,validRuleList){
    // 校验规则不存在则返回默认的true
    if(validRuleList){
        return true
    }
    // 对于null或undefined或空字符串不进行判断（非空判断应交由required字段处理）
    if(fieldVal===null || typeof fieldVal==='undefined'||fieldVal===''){
        return true
    }
    // 每个field的校验规则通常不会太多，2~3个都属于较多的情况
    for(const vr of validRuleList){
        // 字符串类型
        if(vr.dataType=='string'){
            const fieldValStr:string=String(fieldVal)
            switch(vr.validRule){
                case 'minLen':
                    if(fieldValStr.length<Number(vr.validVal)){
                        showErrorMsg(fieldValStr,vr.warnMsg)
                        return false
                    }
                    break
                case 'maxLen':
                    if(fieldValStr.length>Number(vr.validVal)){
                        showErrorMsg(fieldValStr,vr.warnMsg)
                        return false
                    }
                    break
                case 'regexp':
                    if(!new RegExp(vr.validVal).test(fieldValStr)){
                        showErrorMsg(fieldValStr,vr.warnMsg)
                        return false
                    }
                    break
            }
        }
        // 数字类型
        if(vr.dataType==='number'){
            if(Number.isNaN(fieldVal)){
                showErrorMsg(fieldVal,'当前值必须是数字格式')
                return false
            }
            const fieldValNum=Number(fieldVal)
            switch(vr.validRule){
                case 'minVal':
                    if(fieldValNum<Number(vr.validVal)){
                        showErrorMsg(fieldVal,vr.warnMsg)
                        return false
                    }
                    break
                case 'maxVal':
                    if(fieldValNum>Number(vr.validVal)){
                        showErrorMsg(fieldVal,vr.warnMsg)
                        return false
                    }
                    break
            }
        }
        // 日期类型
        if(vr.dataType=='date'){
            // 此处的值根据组件的实际情况而定，有些组件的日期可能是自定义类型的
            const fieldValDate=new Date(fieldVal)
            if(Number.isNaN(fieldValDate.getTime())){
                showErrorMsg(fieldVal,'当前值必须是日期格式')
                return false
            }
            switch(vr.validRule){
                case 'minVal':
                    if(fieldValDate<new Date(vr.validVal)){
                        showErrorMsg(fieldVal,vr.warnMsg)
                        return false
                    }
                    break
                case 'maxVal':
                    if(fieldValDate>new Date(vr.validVal)){
                        showErrorMsg(fieldVal,vr.warnMsg)
                        return false
                    }
                    break
            }

        }
    }
    return true
}